package com.crayon2f.test.kindle;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 批量图片处理工具：
 * - 将图片强制拉伸成 480（宽）x 640（高）【可修改为 640x480】
 * - 不保持原比例，允许拉伸变形
 * - 使用最近邻插值，避免模糊（可能有锯齿）
 * - 避免 JPEG 文件被过度压缩导致体积变小、画质下降（高质量输出）
 * - 支持批量处理某个文件夹中的图片，自动跳过非图片格式
 */
public class HandleImage640x480 {

    // ===========================
    // ✅ 你可以在这里修改目标尺寸
    // 目前是：480（宽） x 640（高）【竖图】
    // 如果你想要 640（宽）x 480（高）【横图】，请修改为：
    // private static final int TARGET_WIDTH = 640;
    // private static final int TARGET_HEIGHT = 480;
    // ===========================
    private static final int TARGET_WIDTH = 480;
    private static final int TARGET_HEIGHT = 640;

    // 支持处理的图片格式
    private static final Set<String> SUPPORTED_FORMATS = new HashSet<>(Arrays.asList(
            "jpg", "jpeg", "png", "bmp", "gif"
    ));

    public static void main(String[] args) {
        // ===========================
        // ✅ 你可以在这里修改输入 / 输出文件夹路径
        // ===========================
        String inputFolderPath = "D:\\download\\edit-book\\input_images";
        String outputFolderPath = "D:\\download\\edit-book\\output_images_640×480";

        File inputFolder = new File(inputFolderPath);
        File outputFolder = new File(outputFolderPath);

        if (!inputFolder.exists() || !inputFolder.isDirectory()) {
            System.err.println("❌ 输入文件夹不存在或不是一个目录: " + inputFolderPath);
            return;
        }

        if (!outputFolder.exists()) {
            boolean created = outputFolder.mkdirs();
            if (!created) {
                System.err.println("❌ 无法创建输出文件夹: " + outputFolderPath);
                return;
            }
            System.out.println("✅ 已创建输出文件夹: " + outputFolderPath);
        }

        File[] files = inputFolder.listFiles();
        if (files == null || files.length == 0) {
            System.err.println("❌ 输入文件夹为空: " + inputFolderPath);
            return;
        }

        int processedCount = 0;
        int skippedCount = 0;

        System.out.println("🔍 开始批量处理图片，目标尺寸: " + TARGET_WIDTH + "x" + TARGET_HEIGHT);
        System.out.println("📂 输入文件夹: " + inputFolderPath);
        System.out.println("💾 输出文件夹: " + outputFolderPath);

        for (File inputFile : files) {
            if (inputFile.isDirectory()) continue;

            String fileName = inputFile.getName();
            String fileExt = getFileExtension(fileName).toLowerCase();

            if (!SUPPORTED_FORMATS.contains(fileExt)) {
                System.out.println("⏩ 跳过非图片文件: " + fileName);
                skippedCount++;
                continue;
            }

            try {
                BufferedImage originalImage = ImageIO.read(inputFile);
                if (originalImage == null) {
                    System.out.println("⚠️ 无法读取图片（可能格式不支持）: " + fileName);
                    skippedCount++;
                    continue;
                }

                // 创建目标尺寸的图片对象（RGB 模式，兼容大多数情况）
                BufferedImage resizedImage = new BufferedImage(TARGET_WIDTH, TARGET_HEIGHT, BufferedImage.TYPE_INT_RGB);

                // 使用 Graphics2D 绘制，并设置最近邻插值（避免模糊，可能锯齿）
                Graphics2D g2d = resizedImage.createGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
                g2d.drawImage(originalImage, 0, 0, TARGET_WIDTH, TARGET_HEIGHT, null);
                g2d.dispose();

                // 输出文件
                File outputFile = new File(outputFolder, fileName);
                String formatName = fileExt; // 如 jpg, png

                // ✅ 高质量写入（特别是对 JPEG 进行高质量压缩，避免默认压缩导致文件过小）
                boolean success = writeHighQualityImage(resizedImage, formatName, outputFile);

                if (success) {
                    System.out.println("✅ 已处理: " + fileName + " → " + TARGET_WIDTH + "x" + TARGET_HEIGHT);
                    processedCount++;
                } else {
                    System.out.println("❌ 写入失败: " + fileName);
                    skippedCount++;
                }

            } catch (IOException e) {
                System.err.println("❌ 处理出错: " + fileName + " - " + e.getMessage());
                skippedCount++;
            }
        }

        System.out.println("\n📊 批量处理完成！");
        System.out.println("✅ 成功处理: " + processedCount + " 张");
        System.out.println("⏩ 跳过: " + skippedCount + " 张");
    }

    /**
     * 获取文件扩展名，如 "jpg"、"png"
     */
    private static String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex == -1 || lastDotIndex >= fileName.length() - 1) {
            return "";
        }
        return fileName.substring(lastDotIndex + 1);
    }

    /**
     * 高质量图片写入方法：
     * - 对 JPEG 使用高质量压缩（quality = 0.95），避免默认压缩导致文件过小
     * - 对 PNG / 其它格式，使用默认写入
     */
    private static boolean writeHighQualityImage(BufferedImage image, String formatName, File outputFile) {
        if ("jpg".equalsIgnoreCase(formatName) || "jpeg".equalsIgnoreCase(formatName)) {
            try {
                ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
                ImageWriteParam param = writer.getDefaultWriteParam();

                if (param.canWriteCompressed()) {
                    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                    param.setCompressionQuality(0.95f); // 推荐：0.9 ~ 1.0，越高越清晰，文件越大
                }

                try (ImageOutputStream out = ImageIO.createImageOutputStream(outputFile)) {
                    writer.setOutput(out);
                    writer.write(null, new IIOImage(image, null, null), param);
                    writer.dispose();
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        } else {
            // PNG / BMP / GIF 等，使用默认 ImageIO 写入（无损或默认压缩）
            try {
                return ImageIO.write(image, formatName, outputFile);
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
    }
}